(function() {
    /**
     * 获取用户信息
     *
     * @param responseCallback 应答回调
     *
     * 应答：
     * {
     *     "code": xx,
     *     "msg": "xx",
     *     "data": {
     *         "userId": "xx",
     *         "sn": "xx",
     *         "msisdn": "xx"
     *     }
     * }
     */
    function getUserInfo(responseCallback) {
        callNative(
            "getUserInfo",
            null,
            responseCallback
        );
    }

    /**
     * 获取App信息
     *
     * @param responseCallback 应答回调
     *
     * 应答：
     * {
     *     "code": xx,
     *     "msg": "xx",
     *     "data": {
     *         "versionCode": "xx",
     *         "versionName": "xx"
     *     }
     * }
     */
    function getAppInfo(responseCallback) {
        callNative(
            "getAppInfo",
            null,
            responseCallback
        );
    }

    /**
     * 获取手机信息
     *
     * @param responseCallback 应答回调
     *
     * 应答：
     * {
     *     "code": xx,
     *     "msg": "xx",
     *     "data": {
     *         "imei": "xx",
     *         "imsi": "xx"
     *     }
     * }
     */
    function getPhoneInfo(responseCallback) {
        callNative(
            "getPhoneInfo",
            null,
            responseCallback
        );
    }

    /**
     * 显示Toast信息
     *
     * @param msg 消息
     */
    function showToast(msg) {
        callNative(
            "showToast",
            {"duration" : 0, "msg" : msg},
            null
        );
    }

    /**
     * 显示Alert对话框
     *
     * @param title 标题
     * @param msg 消息
     */
    function showAlertDialog(title, msg) {
        callNative(
            "showAlertDialog",
            {"title" : title, "msg" : msg},
            null
        );
    }

    /**
     * 打开窗口
     *
     * @param type 类型(对应CMS中的openWindow)
     * @param jsonParam json格式的参数(对应CMS中的openWindow之外的其他参数)
     * @note paramJson支持的参数有：productTitle, productUrl, productIcon, openLogin, productValue等。
     *       根据具体需要打开的应用而定，详情参见文档。
     */
    function openWindow(type, jsonParam, responseCallback) {
        callNative(
            "openWindow",
            {"type" : type, "jsonParam" : jsonParam},
            responseCallback
        );
    }

    /**
     * 打开系统浏览器
     */
    function openSysBrowser(url, responseCallback) {
        callNative(
            "openSysBrowser",
            {"url" : url},
            responseCallback
        );
    }

    /**
     * 打开分享
     *
     * @param text 文本
     * @param description 描述
     * @param imageUrl 图片url
     * @param url url
     * @param platform 平台代码 (1 - 新浪，2 - 短信，3 - QQ，4 - 微信，5 - 微信朋友圈)
     * @param responseCallback 回调
     */
    function openShare(text, description, imageUrl, url, platform, responseCallback) {
        callNative(
            "openShare",
            {"text" : text, "description" : description, "imageUrl" : imageUrl, "url" : url, "platform" : platform},
            responseCallback
        );
    }

    /**
     * 打开登录
     *
     * @param responseCallback 回调
     */
    function openLogin(responseCallback) {
        callNative(
            "openLogin",
            null,
            responseCallback
        );
    }

    /**
     * 增加播放器
     *
     * @param width 宽度
     * @param height 高度
     * @param top 起始top
     * @param left 起始left
     * @param url 播放链接
     * @param title 标题
     * @param thumbImage 占位图
     * @param responseCallback 回调
     */
    function addVideoPlayer(width, height, top, left, url, title, thumbImage, responseCallback) {
        callNative(
            "addVideoPlayer",
            {"width" : width, "height" : height, "top" : top, "left" : left, "url" : url, "title" : title, "thumbImage" : thumbImage},
            responseCallback
        );
    }

    /**
     * 删除播放器
     *
     * @param title 标题
     * @param responseCallback 回调
     */
    function removeVideoPlayer(title, responseCallback) {
        callNative(
            "removeVideoPlayer",
            {"title" : title},
            responseCallback
        );
    }

    /**
     * 路由
     *
     * @param url 路由的定位符
     * @param param 参数(JSON格式)
     */
    function route(url,param, responseCallback) {
        callNative(
            "route",
            {"url" : url, "param" : param},
            responseCallback
        );
    }

    /**
     * 调用Native方法
     */
    function callNative(funcName, param, responseCallback) {
        // 检测对象是否创建
        if (window.WebViewJavascriptBridge) {
            window.WebViewJavascriptBridge.callHandler(
                funcName,
                param,
                responseCallback
            );

        } else {
            // 未创建则监听Ready消息
            document.addEventListener(
                'WebViewJavascriptBridgeReady'
                , function() {
                    window.WebViewJavascriptBridge.callHandler(
                        funcName,
                        param,
                        responseCallback
                    );
                },
                false
            );
        }
    }

    // 定义全局对象
    AppInterface = {
        getUserInfo: getUserInfo,
        getAppInfo: getAppInfo,
        getPhoneInfo: getPhoneInfo,
        showToast: showToast,
        showAlertDialog: showAlertDialog,
        openWindow: openWindow,
        openSysBrowser: openSysBrowser,
        openShare: openShare,
        openLogin: openLogin,
        addVideoPlayer: addVideoPlayer,
        removeVideoPlayer: removeVideoPlayer,
        route: route,
        // 与IOS统一，导出通用调用原生的方法
        callHandler: callNative
    };
})();